vector的erase()

您所在的位置:网站首页 i have a eraser对吗 vector的erase()

vector的erase()

2024-07-15 15:49| 来源: 网络整理| 查看: 265

erase的函数原型有两种形式:

iterator erase(iterator position);//删除单个位置 iterator erase(iterator first, iterator last);//删除一段

在进行单个元素删除后,传入的迭代器指向不变,仍然指向被删除元素的位置,而被删除元素之后的所有元素都向前移动一位,也就是该迭代器实际上是指向了原来被删除元素的下一个元素。 

删除一段段元素之后,后面的元素(从iter_end开始到vector.end())会被复制到被删除元素段开始的地方(iter_begin开始),而vector.end()也根据删除的元素个数往前移动。

总结:erase操作传入迭代器,迭代器所指位置在删除前后不发生改变,改变的只是容器中元素值。删除该元素后,被删元素后面的所有元素复制到被删元素位置上,尾部迭代器也移动到新的尾部位置。

注意事项:

对vector中的数据进行去除的时候,最好是用C++的迭代器,这样不容易出错。

vector veci; veci.push_back(1); veci.push_back(2); veci.push_back(3); veci.push_back(4); veci.push_back(5); veci.push_back(3); veci.push_back(2); veci.push_back(3); for(vector::iterator iter=veci.begin(); iter!=veci.end(); iter++) { if( *iter == 3) veci.erase(iter); }

问题:其实这里面隐藏着一个很严重的错误:当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。

应该改为:

for(vector::iterator iter=veci.begin(); iter!=veci.end(); iter++) { if( *iter == 3) iter = veci.erase(iter); }

这段代码也是错误的:1)无法删除两个连续的"3"; 2)当3位于vector最后位置的时候,也会出错(在veci.end()上执行 ++ 操作)

for(vector::iterator iter=veci.begin(); iter!=veci.end(); ) { if( *iter == 3) iter = veci.erase(iter); else iter ++ ; }

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3